home *** CD-ROM | disk | FTP | other *** search
- ;;; *** lEdit - Lisp Editor ***
- ;;; (c) 1995 Urs Bisang
- ;;; Version 0.1
- ;;;
- ;;; dieses file enthaelt high-level support routinen
- ;;; fuer das txt modul von riscoslib
- ;;;
-
-
- ;;; *** globale variablen ***
-
- ;; liste aller aktiver text buffers
- (define *text-bufferlist* '())
-
- ;; default name um eine selection abzuspeichern
- (define *text-selection-name* "Selection")
-
- ;; das letzte von find benutzte suchstring
- (define *text-previous-searchstring* "")
-
- ;; flag das anzeigt ob find casesensitiv suchen soll
- (define *text-casesensitiv-find* #f)
-
- ;; bringe den cursor an den start des text buffers
- (define (text-cursor-home text) (txt-setdot text 0))
-
- ;; bringe den cursor ans ende des text buffers
- (define (text-cursor-end text)
- (txt-setdot text (txt-size text)))
-
-
- ;; bewege den cursor um eine bildschirmhoehe nach unten
- (define (text-cursor-pagedown text)
- (txt-movevertical text (txt-visiblelinecount text) 1))
-
- ;; bewege den cursor um eine bildschirmhoehe nach oben
- (define (text-cursor-pageup text)
- (txt-movevertical text (- (txt-visiblelinecount text)) 1))
-
- ;; loesche n zeichen an der stelle i im textbuffer
- (define (text-deleteat text i n)
- ;; falls der dot nach der selection ist, adjust dot.
- ;; falls der dot innerhalb der selection ist,
- ;; setze dot an den anfang der selection
- (if (> (txt-dot text) i)
- (if (< (txt-dot text) (+ i n))
- (txt-setdot text i)
- (txt-movedot text (- n))))
- (let ((old-dot (txt-dot text)))
- (txt-setdot text i)
- (txt-delete text n)
- (txt-setdot text old-dot)))
-
-
- ;; loesche selektierten text aus dem textbuffer
- (define (text-delete-selection)
- (if (txtscrap-selectowner)
- (let ((text (txtscrap-selectowner))
- (start (txt-selectstart text))
- (end (txt-selectend text)))
- (text-deleteat text start (- end start))
- (text-clear-selection))))
-
-
- ;; loesche eine selektion
- (define (text-clear-selection)
- (if (txtscrap-selectowner)
- (txtscrap-setselect (txtscrap-selectowner) 0 0)))
-
-
- ;; kopiere eine selection
- (define (text-copy-selection text1)
- (if (txtscrap-selectowner)
- (let ((text2 (txtscrap-selectowner))
- (selection (txt-getselection text2)))
- (txt-insertstring* text1 selection))))
-
-
- ;; verschiebe eine selection
- (define (text-move-selection text1)
- (if (txtscrap-selectowner)
- (let ((text2 (txtscrap-selectowner))
- (n (- (txt-selectend text2)
- (txt-selectstart text2)))
- (selection (txt-getselection text2)))
- (text-delete-selection)
- (txt-insertstring text1 selection)
- (txtscrap-setselect text1
- (txt-dot text1)
- (+ (txt-dot text1) n))
- (txt-movedot text1 n))))
-
-
- ;; ist ein text buffer veraendert seit der letzten speicherung ?
- (define (text-buffer-updated? text)
- (= (bit-and (txt-charoptions text) 4) 4))
-
-
- ;; zeige aenderungen im text buffer nicht sofort an
- (define (text-dont-update text)
- (txt-setcharoptions text 1 0))
-
-
- ;; zeige aenderungen im text buffer sofort an
- (define (text-update text)
- (txt-setcharoptions text 1 1))
-
-
- ;; update den titel eines editor windows
- (define (text-update-title text)
- (txt-settitle text
- (string-concat
- (if (getp text 'filename)
- (getp text 'filename)
- *lisp-untitled-name*)
- (if (text-buffer-updated? text)
- " *"
- "")
- (if (> (txtwin-number text) 1)
- (string-concat " " (txtwin-number text))
- "")
- " (" (getp text 'modename) ")")))
-
-
- ;; erzeuge einen neuen view eines schon bestehenden windows
- (define (text-new-view text)
- (let ((text1 (gensym)))
- (set-eval! text1 text)
- (txtwin-new text)
- ;; bug in riscos lib???
- ;; window title und menu handler muessen hier neu gesetzt werden
- ;; damit es funktioniert !!
- (text-update-title text)
- (event-attachmenumaker (txt-syshandle text)
- lisp-ledit-menu-maker&handler
- text1)))
-
-
- ;; schliesse ein fenster eines text buffers und speichere
- ;; den buffer (falls noetig) wenn das letzte fenster des
- ;; buffers geschlossen wird
- (define (text-close-window text)
- (if (> (txtwin-number text) 1)
- (begin (txtwin-dispose text)
- (text-update-title text))
- (text-remove-buffer text)))
-
-
- ;; entferne einen buffer und schliesse alle zum buffer gehoerenden
- ;; fenster. frage ob der buffer gespeichert werden soll, falls er
- ;; veraendert wurde
- (define (text-remove-buffer text)
- (if (text-buffer-updated? text)
- (if (text-query-save text)
- (text-kill-buffer text))
- (text-kill-buffer text)))
-
-
- ;; fragt mit einer dialogbox ob ein buffer gesaved werden soll
- ;; und speichert den buffer falls es zutrifft
- (define (text-query-save text)
- (let ((field (dbox-popup "close" "This file has been modified")))
- (cond
- ((= field 0) (text-save-buffer text)) ; save
- ((= field 2) #t) ; discard
- ((= field 3) #f) ; cancel
- (else #f))))
-
-
- ;; entfernt einen buffer aus dem speicher und der buffer-liste
- (define (text-kill-buffer text)
- (set! *text-bufferlist* (list-remove *text-bufferlist* text))
- ;; bug in riscoslib? text selection wird nicht geloescht,
- ;; wenn buffer entfernt wird !!! muss explizit geloescht werden!
- (if (equal? text (txtscrap-selectowner))
- (text-clear-selection))
- (txt-dispose text))
-
- ;; gib die anzahl modifizierter text buffer zurueck oder #f
- (define (text-modified-buffers)
- (let ((n 0) (l *text-bufferlist*))
- (while l
- (if (text-buffer-updated? (car l))
- (inc! n))
- (set! l (cdr l)))
- (if (= n 0) #f n)))
-
-
- ;; speichere einen text buffer
- (define (text-save-buffer text)
- (if (getp text 'filename)
- (text-save text)
- (text-saveas text)))
-
-
- ;; speichere text buffer mittels dragging
- (define (text-saveas text)
- (let ((filename (getp text 'filename)))
- (cond (filename (txt-saveas text filename 0 (txt-size text) #t))
- (else (set! filename
- (txt-saveas text (getp text 'defaultname)
- 0 (txt-size text) #t))
- (cond (filename (setp! text 'filename filename)
- (text-update-title text)
- filename)
- (else #f))))))
-
-
- ;; speichere current selection mittels dragging
- (define (text-save-selection text1)
- (let ((text (txtscrap-selectowner)))
- (if text
- (txt-saveas text
- *text-selection-name*
- (txt-selectstart text)
- (txt-selectend text)
- #t))))
-
- ;; printe current selection
- (define (text-print-selection text1)
- (let ((text (txtscrap-selectowner)))
- (if text
- (if (not (txt-print text
- (txt-selectstart text)
- (txt-selectend text)
- #t))
- (werr 0 "can't print - printer application not found")))))
-
-
- ;; speichere text buffer bei schon bekanntem namen
- (define (text-save text)
- (let ((filename (getp text 'filename)))
- (if filename
- (begin
- (txt-save text filename 0 (txt-size text) #t)
- (text-update-title text)
- #t)
- #f)))
-
-
- ;; printe den inhalt des text buffers
- (define (text-print text)
- (if (not (txt-print text 0 (txt-size text) #t))
- (werr 0 "can't print - printer application not found")))
-
-
- ;; fuege ein in ein editor window gedraggtes file an der cursor
- ;; position ein
- (define (text-insert-dragged-file text)
- (let ((filename (car (xferrecv-checkinsert))))
- (cond ((txt-load text filename (txt-dot text) #t)
- (txt-setcharoptions text 4 4) ; text is updated
- (text-update-title text)))
- (xferrecv-insertfileok)))
-
-
- ;; lade ein in auf das baricon gedraggtes file und zeige
- ;; es in einem neuen window an
- ;; im moment gibt es nur einen mode und einen fileloader
- (define (text-load-dragged-file)
- (let ((filename (car (xferrecv-checkinsert))))
- (lisp-load-file filename)
- (xferrecv-insertfileok)))
-
-
- ;; lade ein file aufgrund eines dataopen events und zeige
- ;; es in einem neuen window an
- ;; im moment gibt es nur einen mode und einen fileloader
- (define (text-dataopen-proc)
- (let ((res (xferrecv-checkinsert))
- (filename (first res))
- (filetype (second res)))
- (cond ((= filetype #xfff) ; nur textfiles werden geladen
- (lisp-load-file filename)
- (xferrecv-insertfileok))))) ; acknowledge dataopen
-
-
-
- ;; pruefe ob das file schon geladen ist (multiple-loaded) und
- ;; zeige eine dialog-box an, falls das file schon geladen wurde
- (define (text-file-loaded? filename)
- (let ((l *text-bufferlist*) (res #f))
- (while l
- (if (equal? (getp (car l) 'filename) filename)
- (let ((field (dbox-popup "MultiEdit"
- (string-concat "'" filename
- "' is already loaded!"))))
- (cond
- ((= field 0) (set! res #f)) ; trotzdem editieren
- ((= field 2) (set! res #t)) ; cancel
- (else (set! res #t))) ; forget it
- (set! l nil))) ; exit loop
- (set! l (cdr l)))
- res))
-
-
-
- ;; zeige die goto dialog box an und springe zur eingegebenen zeile
- (define (text-goto-dbox text)
- (let ((d (dbox-new "goto")))
- (dbox-setnumeric d 2 (txt-linenumber text))
- (dbox-setnumeric d 3 (txt-dot text))
- (dbox-show d)
- (if (>= (dbox-fillin d) 0)
- (txt-movevertical text (- (dbox-getnumeric d 4)
- (txt-linenumber text)) 0))
- (dbox-dispose d)))
-
-
- ;; zeige die replace dialog box an und ersetze text
- (define (text-replace-dbox text)
- (let ((d (dbox-new "replace"))
- (field 0)
- (pending #t))
- ;; setze felder auf default werte
- (if *text-casesensitiv-find*
- (dbox-setnumeric d 7 1)
- (dbox-setnumeric d 7 0))
- (dbox-setfield d 8 "Please enter search string")
- (dbox-show d)
- (while pending
- (set! field (dbox-fillin d))
- ;; case sensitives suchen ?
- (if (\= (dbox-getnumeric d 7) 0)
- (set! *text-casesensitiv-find* #t)
- (set! *text-casesensitiv-find* #f))
- (cond
- ;; Go, suche vom anfang des buffers an
- ((= field 0)
- (txt-setdot text 0)
- (text-find-next text d))
- ;; Previous
- ((= field 1) (text-find-previous text d))
- ;; Search String (no action)
- ((= field 2) #t)
- ;; Replace
- ((= field 5) (text-do-replace text d))
- ;; Replace All
- ((= field 6) (text-do-replace-all text d))
- ;; Replace String & Next
- ((or (= field 3) (= field 4))
- (text-find-next text d))
- (else (set! pending #f))))
- (dbox-dispose d)))
-
- ;; ersetze gefundenes string im text buffer
- (define (text-do-replace text d)
- (cond ((txt-selectset text)
- (txt-setdot text (txt-selectstart text))
- (txt-delete text (- (txt-selectend text)
- (txt-selectstart text)))
- (txt-insertstring* text (dbox-getfield d 3 60))
- (text-find-next text d))))
-
-
- ;; ersetze alle passenden strings bis zum ende des text buffers
- (define (text-do-replace-all text d)
- (let ((count 0)
- (old-pos (txt-dot text))
- (found #f)
- (s (dbox-getfield d 2 60)))
- (cond ((> (length s) 0)
- (dbox-setfield d 8 "replacing ...")
- (text-dont-update text)
- (set! *text-previous-searchstring* s)
- (while (set! found (txt-findforward text s
- *text-casesensitiv-find*))
- (inc! count)
- (text-do-replace text d))
- (dbox-setfield d 8 (string-concat count " replaced"))
- (txt-setdot text old-pos)
- (text-update text)))))
-
- ;; zeige die find dialog box an und suche den text
- (define (text-find-dbox text)
- (let ((d (dbox-new "find"))
- (field 0)
- (pending #t))
- ;; setze felder auf default werte
- (if *text-casesensitiv-find*
- (dbox-setnumeric d 6 1)
- (dbox-setnumeric d 6 0))
- (dbox-setfield d 8 "Please enter search string")
- (dbox-show d)
- (while pending
- (set! field (dbox-fillin d))
- ;; case sensitives suchen ?
- (if (\= (dbox-getnumeric d 6) 0)
- (set! *text-casesensitiv-find* #t)
- (set! *text-casesensitiv-find* #f))
- (cond
- ;; Go, suche vom anfang des buffers an
- ((= field 0)
- (txt-setdot text 0)
- (text-find-next text d))
- ;; Previous
- ((= field 1) (text-find-previous text d))
- ;; Count
- ((= field 4) (text-find-count text d))
- ;; Search String & Next
- ((or (= field 2) (= field 3))
- (text-find-next text d))
- (else (set! pending #f))))
- (dbox-dispose d)))
-
-
- ;; zaehle wie oft das suchstring im text buffer vorkommt
- (define (text-find-count text d)
- (let ((count 0)
- (old-pos (txt-dot text))
- (found #f)
- (s (dbox-getfield d 2 60)))
- (cond ((> (length s) 0)
- (dbox-setfield d 8 "counting ...")
- (text-dont-update text)
- (set! *text-previous-searchstring* s)
- (while (set! found (txt-findforward text s
- *text-casesensitiv-find*))
- (inc! count)
- (txt-setdot text (second found)))
- (dbox-setfield d 8 (string-concat count " found"))
- (txt-setdot text old-pos)
- (text-update text)))))
-
-
- ;; suche das suchstring im textbuffer in vorwaertsrichtung
- (define (text-find-next text d)
- (let ((s (dbox-getfield d 2 60)))
- (cond ((> (length s) 0)
- (set! *text-previous-searchstring* s)
- (set! found (txt-findforward text s *text-casesensitiv-find*))
- (cond (found
- (txtscrap-setselect text (car found) (second found))
- (txt-setdot text (second found))
- (dbox-setfield d 8 "String found"))
- (else (dbox-setfield d 8 "String not found")))))))
-
-
- ;; suche das suchstring im textbuffer in rueckwaertsrichtung
- (define (text-find-previous text d)
- (let ((s (dbox-getfield d 2 60)))
- (cond ((> (length s) 0)
- (set! *text-previous-searchstring* s)
- (set! found (txt-findbackward text s *text-casesensitiv-find*))
- (cond (found
- (txtscrap-setselect text (car found) (second found))
- (txt-setdot text (car found))
- (dbox-setfield d 8 "String found"))
- (else (dbox-setfield d 8 "String not found"))))
- (else (dbox-setfield d 2 *text-previous-searchstring*)))))
-
-